/**
 * 手机抽象父类：封装共性属性+实现通用功能，继承所有功能接口
 */
public abstract class Phone implements CameraFunction, BatteryFunction, SystemFunction, CommunicationFunction {
    // 1. 共性属性（所有手机都具备，用protected修饰，子类可访问）
    protected String brand; // 品牌
    protected String model; // 型号
    protected int ram;      // 运行内存（GB）
    protected int storage;  // 存储内存（GB）
    protected int batteryPercent; // 剩余电量（%）
    protected String currentCamera; // 当前相机（默认后置）

    // 2. 构造方法：初始化核心属性
    public Phone(String brand, String model, int ram, int storage) {
        this.brand = brand;
        this.model = model;
        this.ram = ram;
        this.storage = storage;
        this.batteryPercent = 100; // 开机默认满电
        this.currentCamera = "back"; // 默认后置相机
    }

    // 3. 实现通用功能（接口的通用逻辑，子类可直接继承）
    @Override
    public String powerOn() {
        return brand + model + " 开机成功！当前电量：" + batteryPercent + "%，系统启动中...";
    }

    @Override
    public String powerOff() {
        return brand + model + " 关机成功，感谢使用！";
    }

    @Override
    public String switchCamera(String cameraType) {
        if ("front".equals(cameraType) || "back".equals(cameraType)) {
            this.currentCamera = cameraType;
            return "相机切换至" + ("front".equals(cameraType) ? "前置" : "后置") + "成功";
        }
        return "切换失败！仅支持 \"front\"（前置）或 \"back\"（后置）";
    }

    @Override
    public String charge(int powerWatt) {
        if (powerWatt <= 0) {
            return "充电功率无效！请输入正整数";
        }
        // 充电逻辑：功率越大，充电越快（模拟）
        int chargeAmount = powerWatt / 10;
        batteryPercent = Math.min(batteryPercent + chargeAmount, 100); // 最多充至100%
        return "以 " + powerWatt + "W 功率充电，当前电量：" + batteryPercent + "%";
    }

    @Override
    public int consumePower(int minutes) {
        if (minutes <= 0) {
            return batteryPercent; // 无效时长，电量不变
        }
        // 耗电逻辑：每分钟耗1%电（模拟通用场景）
        batteryPercent = Math.max(batteryPercent - minutes, 0); // 最少剩0%
        return batteryPercent;
    }

    // 4. 抽象方法：留待子类个性化实现（接口中需差异化的功能）
    @Override
    public abstract String takePhoto(); // 不同手机拍照效果不同（如像素、滤镜）

    @Override
    public abstract String showSystemInfo(); // 不同品牌系统信息格式不同

    @Override
    public abstract String makeCall(String phoneNumber); // 通话音效、UI提示不同

    @Override
    public abstract String sendMessage(String phoneNumber, String content); // 短信样式不同

    // 5.  getter方法：供子类/外部获取属性（封装必备）
    public String getBrand() { return brand; }
    public String getModel() { return model; }
    public int getRam() { return ram; }
    public int getStorage() { return storage; }
    public int getBatteryPercent() { return batteryPercent; }
}

